package com.example.demo.common.file.service;

import com.example.demo.common.persistence.model.SysDocFile;
import com.example.demo.common.vo.EbsFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * Created by kete on 2017-12-15.
 */
public interface FileService {
    /**
     * 检查下载IP是否在白名单内
     * @param ipAddr
     * @return
     */
    boolean checkDownLoadIp(String ipAddr);

    /**
     * <p>上传文件到服务器.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.putFile("d:/file/test.xls","bkb","bkb_opening_detail");
     * fileService.putFile("/java/file/test.xls","bkb","bkb_opening_detail");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls</p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @return 上传后的文件id.
     */
    String putFile(String local, String module1, String module2);

    /**
     * <p>上传文件到服务器.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.putFile(new File("d:/file/test.xls"),"bkb","bkb_opening_detail");
     * fileService.putFile(new File("/java/file/test.xls"),"bkb","bkb_opening_detail");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls</p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @return 上传后的文件id.
     */
    String putFile(File local, String module1, String module2);

    /**
     * <p>上传文件到服务器.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * MultipartFile local = object;
     * fileService.putFile(local,"bkb","bkb_opening_detail");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls</p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @return 上传后的文件id.
     */
    String putFile(MultipartFile local, String module1, String module2);

    /**
     * <p>上传文件到服务器,并重新命名.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.putFile("d:/file/test.xls","bkb","bkb_opening_detail","开标记录表.xls");
     * fileService.putFile("/java/file/test.xls","bkb","bkb_opening_detail","开标记录表.xls");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls</p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @param rename  新名字.
     * @return 上传后的文件id.
     */
    String putFile(String local, String module1, String module2, String rename);

    /**
     * <p>上传文件到服务器,并重新命名.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.putFile(new File("d:/file/test.xls"),"bkb","bkb_opening_detail,"开标记录表.xls");
     * fileService.putFile(new File("/java/file/test.xls"),"bkb","bkb_opening_detail,"开标记录表.xls");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls </p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @param rename  新名字.
     * @return 上传后的文件id.
     */
    String putFile(File local, String module1, String module2, String rename);

    /**
     * <p>上传文件到服务器,并重新命名.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * FileInputStream local = new FileInputStream("d:/file/test.xls");
     * fileService.putFile(local,"bkb","bkb_opening_detail,"开标记录表.xls");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls </p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @param rename  新名字.
     * @return 上传后的文件id.
     */
    String putFile(InputStream local, String module1, String module2, String rename);

    /**
     * <p>上传文件到服务器,并重新命名.</p>
     * <pre>
     *
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * MultipartFile local = object;
     * fileService.putFile(local,"bkb","bkb_opening_detail,"开标记录表.xls");
     * </pre>
     * <p>存储路径为 /bkb/bkb_opening_detail/a460fdcd-de36-490e-92be-0a51b9591ac7.xls</p>
     *
     * @param local   本地文件名.
     * @param module1 模块1.
     * @param module2 模块2,代表表名.
     * @param rename  新名字.
     * @return 上传后的文件id.
     */
    String putFile(MultipartFile local, String module1, String module2, String rename);

    /**
     * <p>获取文件,如果本地不存在,从服务器上下载.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.getFileById("ff620957-ad0c-42e3-8d51-3358b44f0afe");
     *
     * </pre>
     * <p>返回的信息有,文件名,文件路径,文件大小,文件,文件流.</p>
     *
     * @param fileId 文件id.
     * @return 文件信息.
     */
    EbsFile getFileById(String fileId);

    EbsFile getFileById(String fileId, String accessCode);

    /**
     * <p>获取多个文件,打成zip包下载,如果本地不存在,从服务器上下载.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.getFileById(new String[]{"ff620957-ad0c-42e3-8d51-3358b44f0afe","7e3b902c-8d0b-4146-b070-b5eb14f132a4"});
     *
     * </pre>
     * <p>返回zip包.</p>
     *
     * @param fileId 文件id.
     * @return 文件信息.
     */
    EbsFile getFileById(String[] fileIds);

    /**
     * <p>获取多个文件数组,分组并打成zip包下载,如果本地不存在,从服务器上下载.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * fileService.getGroupFileById(new String[]{"ff620957-ad0c-42e3-8d51-3358b44f0afe","7e3b902c-8d0b-4146-b070-b5eb14f132a4"});
     *
     * </pre>
     * <p>返回zip包.</p>
     *
     * @param fileId 文件id.
     * @return 文件信息.
     */
    EbsFile getGroupFileById(String[] fileIds);

    /**
     * <p>获取文件,复制到输出流.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * FileOutputStream out = new FileOutputStream("d:/file/test.xls");
     * EbsFile ebsFile = fileService.copyFileById("ff620957-ad0c-42e3-8d51-3358b44f0afe",out);
     *
     * </pre>
     * <p>返回的信息有,文件名,文件路径,文件大小</p>
     *
     * @param fileId 文件id.
     * @param out    输出流.
     * @return 文件信息.
     */
    EbsFile copyFileById(String fileId, OutputStream out);

    /**
     * <p>获取文件,如果本地不存在,从服务器上下载.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * EbsFile ebsFile = fileService.getFileByPath("/yzb/20140701/bkb/bkb_opening_detail/ff620957-ad0c-42e3-8d51-3358b44f0afe.xls",out);
     *
     * </pre>
     * <p>返回的信息有,文件名,文件路径,文件大小,文件,文件流.</p>
     *
     * @param filePath 文件路径.
     * @return 文件信息.
     */
    EbsFile getFileByPath(String filePath);

    /**
     * <p>获取文件,复制到输出流.</p>
     * <pre>
     * @Autowired
     * @Qualifier("ossFileService")
     * private FileService fileService;
     *
     * FileOutputStream out = new FileOutputStream("d:/file/test.xls");
     * EbsFile ebsFile = fileService.getFileByPath("/yzb/20140701/bkb/bkb_opening_detail/ff620957-ad0c-42e3-8d51-3358b44f0afe.xls",out);
     *
     * </pre>
     * <p>返回的信息有,文件名,文件路径,文件大小</p>
     *
     * @param fileId 文件id.
     * @param out    输出流.
     * @return 文件信息.
     */
    EbsFile copyFileByPath(String filePath, OutputStream out);

    /**
     * 获取文件名,通过文件id.
     *
     * @param fileId 文件id.
     * @return 文件名.
     */
    String getFileNameById(String fileId);

    /**
     * 获取文件名,通过文件路径.
     *
     * @param filePath 文件路径.
     * @return 文件名.
     */
    String getFileNameByPath(String filePath);

    /**
     * 获取文件信息,通过文件id.
     *
     * @param fileId 文件id.
     * @return 文件信息.
     */
    SysDocFile getSysDocFileById(String fileId);

    List<SysDocFile> getSysDocFileByIds(String[] ids);

    /**
     * 获取文件信息,通过文件路径.
     *
     * @param filePath 文件路径.
     * @return 文件信息.
     */
    SysDocFile getSysDocFileByPath(String filePath);

    /**
     * 获取临时文件目录.
     *
     * @param module1 模块1.
     * @param module2 模块2.
     * @return 临时文件目录。
     */
    String getTempDir(String module1, String module2);

    String getTempFile(String modules1, String modules2, String ext);

    String tenderFile(String filePath);

    SysDocFile shareFile(String fileId, String expDateStr);

    String getDownloadUrl(String fileId);

    String getFileToken();

    String getDownloadUrlV2(String fileId);

    String getDownLoadParam(String fileId);

    String getGroupDownLoadParam(String fileId);

    /**
     * 断点续传
     * **/
    String getUploadId(String fileName);

    /**
     * 分片上传
     * */
    void multipartUpload(InputStream inputStream, String fileName, String uploadId, long partSize, int partNumber);

    /**
     * 完成上传
     * */
    String completeMultipartUpload(String uploadId, String fileName, String module1, String module2, Long fileSize,String oriFileName,String token);

    /**
     * 获取文件名称
     * */
    String getFileName(String token, String fileName, String module1, String module2);
}
